package com.example.review;

import com.fasterxml.jackson.databind.ser.std.ByteArraySerializer;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * ClassName: DDL
 * Package: com.example.review
 * Description:
 * User: fzykd
 *
 * @Author: LQH
 * Date: 2023-08-06
 * Time: 11:36
 */

public class DDL {

    //从多线程 获取连接对象
    private static Connection instance = ThreadHBase.connection;

    //创建命名空间
    public static void createNamespace(String namespace) throws IOException {

        //1.创建admin
        Admin admin = instance.getAdmin();

        NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace);

        //给命名空间添加需求
        builder.addConfiguration("user","hello");

        //2.通过admin调用创建命名空间的方法
        try {
            admin.createNamespace(builder.build());  //参数是一个namespaceDescriptor
        } catch (IOException e) {
            System.out.println("命名空间已存在");
            e.printStackTrace();
        }

        //连接要关闭 admin也要关闭
        admin.close();

    }


    //判断表格是否存在
    public static boolean isTable(String namespace,String table) throws IOException {

        //1.获取admin
        Admin admin = instance.getAdmin();

        boolean b = false;

        //2.调用判断方法
        try {
            b = admin.tableExists(TableName.valueOf(namespace, table));
        } catch (IOException e) {
            e.printStackTrace();
        }

        //关闭连接
        admin.close();

        return b;

    }

    //创建表格
    public static void createTable(String namespace,String table,String... columnFamily) throws IOException {

        //开始就要判断列族是否是空的
        if (columnFamily.length == 0){
            //可以给一个默认值 或者直接返回
            System.out.println("创建表格至少一个列族");
            return;
        }

        //获取admin
        Admin admin = instance.getAdmin();

        //创建表格描述符
        TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, table));

        //列族是一个可变参数 本质上是一个集合 要遍历拿出里面的数据
        for (String column : columnFamily) {

            //列族 有列族描述器
            ColumnFamilyDescriptorBuilder columnFa =
                    ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(column));

            //对列族添加 参数
            columnFa.setMaxVersions(5);

            builder.setColumnFamily(columnFa.build());

        }

        //创建表格 调用方法
        try {
            admin.createTable(builder.build()); //配置参数
        } catch (IOException e) {
            System.out.println("表格已经存在");
            e.printStackTrace();
        }

        //关闭admin
        admin.close();

    }


    //修改表格 主要是修改列族相关的信息 所以要制定相应列族的版本
    public static void modifyTable(String namespace,String table,String columnFamilies,int version) throws IOException {
        //1。获取admin
        Admin admin = instance.getAdmin();
        //判断表格是否存在
        if(!isTable(namespace,table)){
            System.out.println("表格不存在");
            return;
        }
        //2.调用方法
        try {
            //修改表格 就要有旧的表格信息 来修改
            //通过admin来获取
            TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(namespace, table));

            //参数也是创建表格描述器
            TableDescriptorBuilder tableDescriptorBuilder =
                    TableDescriptorBuilder.newBuilder(descriptor);

            //获取旧的列族表述
            ColumnFamilyDescriptor columnFamily = descriptor.getColumnFamily(Bytes.toBytes(columnFamilies));

            //2.2.对建造者进行表格数据的修改
            //创建列族描述
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder =
                    ColumnFamilyDescriptorBuilder.newBuilder(columnFamily);

            //修改对应的版本
            columnFamilyDescriptorBuilder.setMaxVersions(version);

            //此处修改也要填写旧的信息 如果填写新的信息会初始化其他参数
            tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());
            admin.modifyTable(tableDescriptorBuilder.build());
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3.关闭admin
        admin.close();

    }

    //删除表格 只需要两个参数
    public static boolean deleteTable(String namespace,String tableName) throws IOException {

        //首先就要判断表格是否存在
        if (!isTable(namespace,tableName)){
            System.out.println("表格不存在");
            return false;
        }

        //获取admin
        Admin admin = instance.getAdmin();

        try {
            admin.disableTable(TableName.valueOf(namespace,tableName));
            //HBase 再删除表之前 要将表格标记为不可用
            admin.deleteTable(TableName.valueOf(namespace,tableName));
        } catch (IOException e) {
            e.printStackTrace();
        }

        //关闭admin
        admin.close();

        return true;
    }


    public static void main(String[] args) throws IOException {
        //创建命名空间 namespace
        //createNamespace("hello");

        //判断表格是否存在
        //boolean table = isTable("hello", "haha");
        //System.out.println(table);

        //创建表格
        //createTable("hello","abc","test");

        //测试修改表格
        //modifyTable("hello","abckkk","test",6);

        //删除表格
        boolean b = deleteTable("hello", "abc");
        System.out.println(b);

        System.out.println("其他代码");

        //关闭连接
        instance.close();
    }



}
